<?php

class Application_Model_HistoVenteElement
{
	protected $client;		//objet Application_Model_User
	protected $vendeur;		//idem
	protected $groupe;		//objet Application_Model_Groupe
	protected $montant;
	protected $id_produit;	//eventuellement songer à remplacer par un modele Produit
	protected $varstock;	//variation du stock
	protected $time;
	protected $libelle;

	public function Application_Model_HistoVenteElement($client, $vendeur, $groupe, $montant=0, $id_produit=1, $varstock=0,$libelle, $date=null) //vendeur et client peuvent être passés comme instances de Application_Model_User ou par login, groupe par id ou Application_Model_Groupe
	{
		if(!is_string($client))
		{
			$this->client = $client;
		}
		else
		{
			if($client != 'vente_espèce') {
				$a = Application_Model_User::getByLogin($client);
			} else {
				$a = new Application_Model_User();
				$a->setLogin($client);
			}
			$this->client = $a;
		}


		if(!is_string($vendeur)) {
			$this->vendeur = $vendeur;
		} else {
			$a = Application_Model_User::getByLogin($vendeur);
			$this->vendeur = $a;
		}
		if(!is_int($groupe)) {
			$this->groupe= $groupe;
		}
		else
		{
			$a = new Application_Model_Groupe();
			$a = $a->getByID($groupe);
			$this->groupe = $a;
		}


		$this->montant = $montant;
		$this->varstock = $varstock;
		$this->id_produit = $id_produit;

		$this->libelle = $libelle;
		if(!isset($date))
		{
			$this->time = date('Y-m-d H:i:s');
		}
		else
		{
			$this->time = $date;
		}
	}

	public function save()
	{
		$db = new Application_Model_HistoVenteTable();
		$data = array(
			'id_groupe' => $this->groupe->getID(),
			'login_vendeur' => $this->vendeur->getLogin(),
			'login_client' => $this->client->getLogin(),
			'montant' => $this->montant,
			'id_produit' => $this->id_produit,
			'stock' => $this->varstock,
			'date' => $this->time,
			'libelle' => $this->libelle
		);
		$db->insert($data);
	}

	public function getClient()
	{
		return $this->client;
	}

	public function getVendeur()
	{
		return $this->vendeur;
	}

	public function getMontant()
	{
		return $this->montant;
	}

	public function getProduit()
	{
		return $this->id_produit;
	}

	public function getStock()
	{
		return $this->varstock;
	}

	public function getTime()
	{
		return $this->time;
	}

	public function getLibelle()
	{
		return $this->libelle;
	}

	public function getGroupe()
	{
		return $this->groupe;
	}


	public static function getAll() 	//retourne tous les élements de l'historique, dans un tableau
	{
		$db = new Application_Model_HistoVenteTable();
		$rows = $db ->fetchAll();
		$rep = array();
		foreach ($rows as $r)
		{
			$objet = new self($r['login_client'], $r['login_vendeur'], $r['id_groupe'],$r['montant'], $r['id_produit'], $r['stock'], $r['libelle'], $r['date']);
			$rep[] = $objet;
		}
		return $rep;
	}
	public static function getByVendeur($vendeur) 	//retourne tous les élements de l'historique, associé à  un vendeur
	{
		$login='';
		if(!is_string($vendeur))
	 {
	 	$login=$vendeur->getLogin();
	 }
	 else
	 {
	 	$login=$vendeur;
	 }

	 $db = new Application_Model_HistoVenteTable();
	 $rows = $db ->fetchAll($db->select()->where('login_vendeur= ?',$login));
	 $rep = array();
	 foreach ($rows as $r)
	 {
	 	$objet = new self($r['login_client'], $r['login_vendeur'], $r['id_groupe'],$r['montant'], $r['id_produit'], $r['stock'], $r['libelle'], $r['date']);
	 	$rep[] = $objet;
	 }
	 return $rep;
	}

	public static function getByProduit($produit,$date1='',$date2='') 	//retourne tous les élements de l'historique entre les deux dates, associé à  un produit
	{
		$id='';
		if(!is_numeric($produit))
	 {
	 	$id=$produit->getIdProduit();
	 }
	 else
	 {
	 	$id=$produit;
	 }

	 $db = new Application_Model_HistoVenteTable();
	 if($date1=='' || $date2=='')
	 {
	 	$rows = $db ->fetchAll($db->select()->where('id_produit= ?',$id));
	 }
	 else
	 {
	 	$date1 = $date1;
	 	$date2 = $date2;
	 	$rows = $db ->fetchAll($db->select()->where('id_produit= ?',$id)->where('date >= ?',$date1)->where('date <= ?',$date2));
	 }
	 $rep = array();
	 foreach ($rows as $r)
	 {
	 	$objet = new self($r['login_client'], $r['login_vendeur'], $r['id_groupe'],$r['montant'], $r['id_produit'], $r['stock'], $r['libelle'], $r['date']);
	 	$rep[] = $objet;
	 }
	 return $rep;
	}


	public static function getByClient($client) 	//retourne tous les élements de l'historique, associé à  un client
	{
		$login='';
		if(!is_string($client))
		{
			$login=$client->getLogin();
		}
		else
		{
			$login=$client;
		}

		$db = new Application_Model_HistoVenteTable();
		$rows = $db ->fetchAll($db->select()->where('login_client= ?',$login));
		$rep = array();
		foreach ($rows as $r)
		{
			$objet = new self($r['login_client'], $r['login_vendeur'], $r['id_groupe'],$r['montant'], $r['id_produit'], $r['stock'], $r['libelle'], $r['date']);
			$rep[] = $objet;
		}
		return $rep;
	}

	public static function getByGroup($groupe)		//recherche par ID de groupe, ou groupe
	{
		$login='';
		if(!is_int($groupe))
		{
			$login=$groupe->getID();
		}
		else
		{
			$login=$groupe;
		}
		$db = new Application_Model_HistoVenteTable();
		$rows = $db ->fetchAll($db->select()->where('id_groupe= ?',$login));
		$rep = array();
		foreach ($rows as $r)
		{
			$objet = new self($r['login_client'], $r['login_vendeur'], $r['id_groupe'],$r['montant'], $r['id_produit'], $r['stock'], $r['libelle'], $r['date']);
			$rep[] = $objet;
		}
		return $rep;
	}

	public static function getByGroupBetweenDate($groupe,$date1='',$date2='')		//recherche par ID de groupe, ou groupe
	{
		$id_groupe='';
		if(!is_int($groupe))
		{
			$id_groupe=$groupe->getID();
		}
		else
		{
			$id_groupe=$groupe;
		}
		$db = new Application_Model_HistoVenteTable();
		$rows = $db ->fetchAll($db->select()->where('id_groupe= ?',$id_groupe)->where('date >= ?',$date1)->where('date <= ?',$date2));
		$rep = array();
		foreach ($rows as $r)
		{
			$objet = new self($r['login_client'], $r['login_vendeur'], $r['id_groupe'],$r['montant'], $r['id_produit'], $r['stock'], $r['libelle'], $r['date']);
			$rep[] = $objet;
		}
		return $rep;
	}

	public static function getFiltre($filtre)			//selection sur les couples groupe/vendeur
	{

		$db = new Application_Model_HistoVenteTable();

		$aux=$db->select();

		if(isset($filtre['vendeur'])&&$filtre['vendeur']!='RIEN')
		{
			$aux=$aux->where('login_vendeur =? ',$filtre['vendeur']);
		}

		if(isset($filtre['groupe'])) {
			$aux = $aux->where('id_groupe = ?', $filtre['groupe']->getID());
		}

		if(isset($filtre['debut']))
		{
			$aux=$aux->where('date >= ? ',$filtre['debut']->format('Y-m-d H:i:s'));
		}

		if(isset($filtre['fin']))
		{
			$aux=$aux->where('date <= ? ',$filtre['fin']->format('Y-m-d H:i:s'));
		}

		if($filtre['CB']&&!$filtre['esp'])
		{
			$aux=$aux->where('login_client <> ?', 'vente_espèce');
		}
		if($filtre['esp']&&!$filtre['CB'])
		{
			$aux=$aux->where('login_client = ?', 'vente_espèce');
		}


		$rows = $db ->fetchAll($aux);
		$rep = array();
		foreach ($rows as $r)
		{
			$objet = new self($r['login_client'], $r['login_vendeur'], $r['id_groupe'],$r['montant'], $r['id_produit'], $r['stock'], $r['libelle'], $r['date']);
			$rep[] = $objet;
		}
		return $rep;

	}

	public static function especes($tableau) //récupere le sous-tableau des paiements en espèce.
	{
		$rep=array();
		foreach($tableau as $tab)
		{
			if($tab->client->getLogin()=='vente_espèce')
			{
				$rep[]=$tab;
			}
		}
		return $rep;
	}

	public static function codebar($tableau) //récupere le sous-tableau des paiements en CB
	{
		$rep=array();
		foreach($tableau as $tab)
		{
			if($tab->client->getLogin()!='vente_espèce')
			{
				$rep[]=$tab;
			}
		}
		return $rep;
	}


	public static function somme($arr)		//total des ventes sur le tableau fourni
	{
		$rep=0;
		foreach($arr as $a)
		{
			$rep=$rep+$a->montant;
		}
		return $rep;
	}

	public static function nbr_produits_vendus($arr) //nombre de produits vendus sur le tableau fourni
	{
		$rep = 0;
		foreach($arr as $a)
		{
			$rep = $rep-$a->varstock;
		}
		return $rep;
	}

	public static function getLastItem()
	{
		$db = new Application_Model_HistoVenteTable();
		$select = $db->select()->from($db->getName(), array('maximum'=>'MAX(id_action)'));
		$max = $db->fetchRow($select);
		return Application_Model_HistoVenteElement::getById($max['maximum']);
	}

	public static function getById($id)
	{
		$db = new Application_Model_HistoVenteTable();
		$r = $db->fetchRow($db->select()->where('id_action = ?', $id));
		return new self($r['login_client'], $r['login_vendeur'], $r['id_groupe'],$r['montant'], $r['id_produit'], $r['stock'], $r['libelle'], $r['date']);
	}

	public static function sortByProduct($histoItemList)
	{
		$result = array();
		foreach ($histoItemList as $item)
		{
			$id_product = $item->getProduit();
			$result[$id_product][] = $item;
		}
		return $result;
	}
}